<?php

interface PaymentStrategy
{
    public function pay($amount);
}

// 具体的策略类：微信支付
class WechatPaymentStrategy implements PaymentStrategy{
    public function pay($amount) {
        echo "使用微信支付了：$amount 元<br>";
    }
}

// 具体的策略类：支付宝支付
class AlipayPaymentStrategy implements PaymentStrategy {
    public function pay($amount) {
        echo "使用支付宝支付了：$amount 元<br>";
    }
}

//上下文类，适用策略
class ShoppingCart
{
    private $paymentStrategy;

    public function setPaymentStrategy(PaymentStrategy $paymentStrategy)
    {
        $this->paymentStrategy = $paymentStrategy;
    }

    public function checkout($amount)
    {
        $this->paymentStrategy->pay($amount);
    }
}

//适用实例
$cart = new ShoppingCart();
//选择微信支付
$wechatPayment = new WechatPaymentStrategy();
$cart->setPaymentStrategy($wechatPayment);
$cart->checkout(100);

//选择支付宝
$alipayment = new AlipayPaymentStrategy();
$cart->setPaymentStrategy($alipayment);
$cart->checkout(20);
/*

策略模式的作用包括：将不同的算法封装在独立的策略类中，使得算法的变化不会影响到使用算法的上下文代码。
1.提高代码的可扩展性：当需要添加新的算法（策略）时，只需要创建一个新的策略类实现相同的接口，而无需修改现有的代码。
2.增强代码的可维护性：每个策略类专注于实现一种具体的算法，逻辑清晰，易于理解和维护。

具体案例：1、选择不同的支付渠道；（微信，支付宝）2、比如针对充电不同针对运营商价格策略；（销活动，如满减、折扣、赠品）
 */